package com.grupoconstruobras.sigo.security.auth.cdi;

import com.grupoconstruobras.sigo.core.ICoreNamingJndi;
import com.grupoconstruobras.sigo.core.context.ISessionContext;
import com.grupoconstruobras.sigo.security.auth.data.Relacionrolrecurso;
import com.grupoconstruobras.sigo.security.auth.data.Relacionrolrecursofuncionalidad;
import com.grupoconstruobras.sigo.security.auth.data.Relacionusuariorol;


import java.io.Serializable;
import java.util.List;
import java.util.logging.Logger;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import com.grupoconstruobras.sigo.general.enums.Funcionalidad;

@Stateless(name = "permisoSession", mappedName = "context/permisoSession")
@EJB(beanName = "permisoSession", beanInterface = IPermisoSession.class, name = "ejb/context/permisoSession")
public class PermisoSession implements IPermisoSession, Serializable{

	
	private static final long serialVersionUID = 1L;

	private String user;
		
	private static Logger LOG = Logger.getLogger(PermisoSession.class.getName());
	
	@PersistenceContext(unitName="default")
	private EntityManager entityManager;
	
	public static String SELECT_ROL_USUARIO = "select ru.* from seguridad.relacionusuariorol ru where ru.idusuario = :usuarioLogin and ru.activo = 'S'";
	
	public static String SELECT_VISTAS_USUARIO = "select rvr.idvista from seguridad.relacionvistarol rvr\n"+
												 "inner join seguridad.rol ro on ro.idrol = rvr.idrol\n"+
												 "inner join seguridad.relacionusuariorol rur on rur.idrol = ro.idrol\n"+
												 "inner join public.usuario u on u.login = rur.idusuario\n"+
												 "where u.login = :usuarioLogin and rvr.visible = 'S' and rvr.activo='S' and rur.activo = 'S'\n";
										
	
	public static String SELECT_RECURSOS_ROL = "select rrr.idrecurso \n"+
												"from seguridad.relacionrolrecurso rrr\n"+
												"inner join seguridad.recurso recu on rrr.idrecurso = recu.idrecurso  and rrr.activo = 'S'\n"+
												"inner join seguridad.rol ro on ro.idrol = rrr.idrol and ro.activo = 'S'\n"+
												"inner join seguridad.relacionusuariorol rur on rur.idrol = ro.idrol and rur.activo = 'S'\n"+
												"inner join public.usuario u on u.login = rur.idusuario\n"+
												"where u.login = :usuarioLogin and recu.idvista = :idVista and rur.activo='S'";
	
	public static String SELECT_COMPONENTES_ROL = "select c.nombre\n"+
												  "from seguridad.relacionrolcomponente rrc\n"+
												  "inner join seguridad.componente c on rrc.idcomponente = c.idcomponente\n"+
												  "inner join seguridad.recurso r on c.idrecurso = r.idrecurso\n"+
												  "inner join seguridad.rol ro on rrc.idrol = ro.idrol\n"+
												  "inner join seguridad.relacionusuariorol rur on ro.idrol = rur.idrol\n"+
												  "inner join public.usuario u on rur.idusuario = u.login\n"+
												  "where u.login = :usuarioLogin and  r.idvista =:idvista and rrc.sololectura = 'S' and rrc.idtipofuncionalidad=:funcionalidad and rur.activo='S'";
	
	
	public static String SELECT_VISTAS_ROL = "select rvr.idvista\n"+ 
										   	 "from seguridad.relacionvistarol rvr\n"+
											 "inner join seguridad.vista v on rvr.idvista = v.idvista\n"+
											 "inner join seguridad.rol ro on ro.idrol = rvr.idrol\n"+
											 "inner join seguridad.relacionusuariorol rur on rur.idrol = ro.idrol\n"+
											 "inner join public.usuario u on u.login = rur.idusuario\n"+
											 "where u.login = :usuarioLogin and rvr.activo = 'S' and v.uri=:uri  and rur.activo='S'";
						
	
	public static String SELECT_RECURSOS_VISTA_USUARIO = "select c.nombre from seguridad.relacionrolrecurso rrr\n"+
														"inner join seguridad.recurso r on rrr.idrecurso = r.idrecurso\n"+
														"inner join seguridad.componente c on r.idrecurso = c.idrecurso\n"+
														"inner join seguridad.relacionrolcomponente rrc on rrc.idcomponente = c.idcomponente\n"+
														"inner join seguridad.relacionusuariorol ruo on rrr.idrol = ruo.idrol\n"+
														"inner join public.usuario u on ruo.idusuario = u.login\n"+
														"where  u.login = :usuarioLogin and  r.idvista = :idvista and rrr.activo = 'S' and rrr.sololectura = 'S' and rrr.idtipofuncionalidad=:funcionalidad  and ruo.activo='S'";
	
	public static String SELECT_COMPONENTES_ROL_OCULTAR = "select c.nombre\n"+
														  "from seguridad.relacionrolcomponente rrc\n"+
														  "inner join seguridad.componente c on rrc.idcomponente = c.idcomponente\n"+
														  "inner join seguridad.recurso r on c.idrecurso = r.idrecurso\n"+
														  "inner join seguridad.rol ro on rrc.idrol = ro.idrol\n"+
														  "inner join seguridad.relacionusuariorol rur on ro.idrol = rur.idrol\n"+
														  "inner join public.usuario u on rur.idusuario = u.login\n"+
														  "where u.login = :usuarioLogin and  r.idvista =:idvista and rrc.visible = 'N' and rrc.idtipofuncionalidad=:funcionalidad  and rur.activo='S'";
												
	
	public static String SELECT_RECURSOS_VISTA_USUARIO_OCULTAR = "select r.nombre from seguridad.relacionrolrecurso rrr\n"+
														"inner join seguridad.recurso r on rrr.idrecurso = r.idrecurso\n"+
														"inner join seguridad.componente c on r.idrecurso = c.idrecurso\n"+
														"inner join seguridad.relacionrolcomponente rrc on rrc.idcomponente = c.idcomponente\n"+
														"inner join seguridad.relacionusuariorol ruo on rrr.idrol = ruo.idrol\n"+
														"inner join public.usuario u on ruo.idusuario = u.login\n"+
														"where  u.login = :usuarioLogin and  r.idvista = :idvista and rrr.activo = 'S' and rrr.visible = 'N' and rrr.idtipofuncionalidad=:funcionalidad  and ruo.activo='S'";
	
													
	public PermisoSession(){
		ISessionContext ctx = null;
		try {
			Context jndi = new InitialContext();
			ctx = (ISessionContext) jndi.lookup(ICoreNamingJndi.GLOBAL + "sessionContext!" + ISessionContext.class.getName());
		} catch (NamingException e) {
			LOG.severe(e.getMessage());
		}
		
		setUser(ctx.getPrincipal().getName());
		
	}

	@Override
	public List<Relacionusuariorol> consultarUsuarioRol() {
		Query q = null;
		List<Relacionusuariorol> result = null;
		StringBuilder query = new StringBuilder("");
		query.append(SELECT_ROL_USUARIO);
		q = entityManager.createNativeQuery(query.toString());
		q.setParameter("usuarioLogin", user);
		
		result=q.getResultList();
		
		return result;
	}
	
	@Override
	public List<String> consultarVistasUsuario() {
		
		Query q = null;
		List<String> result = null;
		StringBuilder query = new StringBuilder("");
		query.append(SELECT_VISTAS_USUARIO);
		q = entityManager.createNativeQuery(query.toString());
		q.setParameter("usuarioLogin", user);
		result=q.getResultList();
		
		return result;
	}
	
	
	@Override
	public boolean verificarAccesoVista(String user, String uri) {
		
		
		Query q = null;
		List<Object> result = null;
		StringBuilder query = new StringBuilder("");
		query.append(SELECT_VISTAS_ROL);
		q = entityManager.createNativeQuery(query.toString());
		q.setParameter("usuarioLogin", user);
		q.setParameter("uri", uri);
		result=q.getResultList();
		
		if(result != null){
			if(!result.isEmpty()){
				return true;
			}else{
				return false;
			}
			
		}else{
			return false;
		}
		
		
	}
	
	@Override
	public List<String> consultarComponentesRol(String idvista,Funcionalidad func) {
		Query q = null;
		List<String> result = null;
		StringBuilder query = new StringBuilder("");
		query.append(SELECT_COMPONENTES_ROL);
		q = entityManager.createNativeQuery(query.toString());
		q.setParameter("usuarioLogin", user);
		q.setParameter("idvista", idvista);
		q.setParameter("funcionalidad",func.toString());
		result=q.getResultList();
		return result;
	}
	
	@Override
	public List<String> consultarComponentesRecursosVista(String idvista,Funcionalidad func) {
		Query q = null;
		List<String> result = null;
		StringBuilder query = new StringBuilder("");
		query.append(SELECT_RECURSOS_VISTA_USUARIO);
		q = entityManager.createNativeQuery(query.toString());
		q.setParameter("usuarioLogin", user);
		q.setParameter("idvista", idvista);
		q.setParameter("funcionalidad",func.toString());
		result=q.getResultList();
		return result;
	}
	
	
	@Override
	public List<String> consultarComponentesRecursosVistaOcultar(String idvista,Funcionalidad func) {
		Query q = null;
		List<String> result = null;
		StringBuilder query = new StringBuilder("");
		query.append(SELECT_RECURSOS_VISTA_USUARIO_OCULTAR);
		q = entityManager.createNativeQuery(query.toString());
		q.setParameter("usuarioLogin", user);
		q.setParameter("idvista", idvista);
		q.setParameter("funcionalidad",func.toString());
		result=q.getResultList();
		return result;
	}

	@Override
	public List<String> consultarComponentesRolOcultar(String idvista,Funcionalidad func) {
		Query q = null;
		List<String> result = null;
		StringBuilder query = new StringBuilder("");
		query.append(SELECT_COMPONENTES_ROL_OCULTAR);
		q = entityManager.createNativeQuery(query.toString());
		q.setParameter("usuarioLogin", user);
		q.setParameter("idvista", idvista);
		q.setParameter("funcionalidad",func.toString());
		result=q.getResultList();
		return result;
	}
	
	
	

	@Override
	public Relacionrolrecurso consultarRecursosRol() {

		return null;
	}

	@Override
	public Relacionrolrecursofuncionalidad consultarRecursoFuncionalidad() {

		return null;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	

	

	

	
	
}
